<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /**
     * 其实万变不离其宗，就是咱们小学学过的加减法，满10进1，接下来就1行1行分析下吧。
      22行和23行，就是转为数组，为的就是利用数组的方法pop()一个个对应相加。
      24行，定义一个字符串，为的就是转换为字符串相加。
      25行，就是满10进1，还是不满10进0。
      26行，就是判断两个数组相加完没有，注意这里的flag，是为了防止最后一次相加为10，需要进1的情况。
      27行，这里用到了按位取反运算符(~)，这里用到这个为了解决~~undefined==0，因为[].pop()==undefined，
            而这里flag就是解决满10进1还是满10进0。
      28行，举个例子，5+7=13；13%10=1....3；而这里就是先把3加上
      29行，这个是利用了隐式转换，flag转为1或者0，为了表示进1或进0。
     */
    function add(str1, str2) {
      str1 = str1.split('');
      str2 = str2.split('');
      let res = '';
      let flag = 0;
      while (str1.length || str2.length || flag) {
        flag = ~~str1.pop() + ~~str2.pop() + flag;
        res = flag % 10 + res;
        flag = flag > 9;
      }
      return res.replace(/^0+/, '');
    }
    console.log(add("1213123323213125", "32131231231232132136"));
    // add("1213123323213125","32131231231232132136")  //输出：32132444354555345261
    //   第一轮
    //   flag = flag(0)+5+6
    //   result = 11%10(1) + ""   result="1"
    //   flag = 11 > 9     flag=1  这里就是进满10进1
    //   第二轮
    //   flag = 1+3+2 
    //   result = 6%10(6) + "1"    result="61"
    //   flag = 6 > 9   flag=0  //不满10进0
    //   .......  
    console.log(add('3782647863278468012934670', '23784678091370408971329048718239749083'));
    console.log(add('11111111111111111', '1111111111111111111'));

  </script>
</body>
</html>